var libmath = {};

(function() {

var sieve = [];
var primes= [2];
var sieveSize = 2;
var maxCachedPrime = 2;

sieve[1]=1;
sieve[2]=0;

libmath.PrimeUtils={
    sievePrime : function(size) {
        if(size<=sieveSize) return;
        sieveSize = size;
        for(var i=2; i<=size; i++) {
            for(var j=(i+i); j<=size; j=j+i) {
                sieve[j] = 1;
            }
        }
        for(var i=maxCachedPrime+1; i<=size; i++) {
            if(sieve[i] != 1) primes.push(i);
        }
        maxCachedPrime = primes[primes.length-1];
    },

    isPrime : function(n) {
        if(n<=maxCachedPrime) return sieve[n] !=1;
        var sqrt = Math.floor(Math.sqrt(n));
        for(var i=0; i<primes.length; i++) {
            if(primes[i]>=sqrt) return true;
            if(n%primes[i]==0) return false;
        }
        
        if(sqrt>maxCachedPrime) {
            for(var i=maxCachedPrime+2; i<=sqrt; i++) {
                if(n%i==0) return false;
            }
            return true;
        }
        
    },
    
    printCachedPrimes : function(printFn) {
        var p=printFn || print;
        p('[Cached Primes][Size='+primes.length+']');
        p(primes);
    }
}

})();
